package site.marqstree.latte.compiler;

import com.squareup.javapoet.JavaFile;
import com.squareup.javapoet.TypeName;
import com.squareup.javapoet.TypeSpec;

import java.io.IOException;

import javax.annotation.processing.Filer;
import javax.lang.model.element.Modifier;
import javax.lang.model.type.TypeMirror;
import javax.lang.model.util.SimpleAnnotationValueVisitor7;

// 自动代码生成器
// 生成Activity(WXEntryActivity)代码
// 微信sdk要求定义回调Activity:WXEntryActivity
// 在获取微信用户信息后，微信sdk自动回调该Activity
public final class EntryVisitor extends SimpleAnnotationValueVisitor7<Void, Void> {

    private final Filer FILER;
    private String mPackageName = null;

    EntryVisitor(Filer FILER) {
        this.FILER = FILER;
    }

    //接收EntryGenerator注解中参数:包名
    //包名：字符串
    @Override
    public Void visitString(String s, Void p) {
        mPackageName = s;
        return p;
    }

    //接收EntryGenerator注解中参数:父类类型
    //父类类型：WXEntryTemplate
    @Override
    public Void visitType(TypeMirror t, Void p) {
        //自动生成Activity(WXEntryActivity)代码
        generateJavaCode(t);
        return p;
    }

    //自动生成Activity(WXEntryActivity)代码
    //typeMirror:父类类型
    //mPackageName:包名
    private void generateJavaCode(TypeMirror typeMirror) {
        final TypeSpec targetActivity =
                TypeSpec.classBuilder("WXEntryActivity")
                        .addModifiers(Modifier.PUBLIC)
                        .addModifiers(Modifier.FINAL)
                        .superclass(TypeName.get(typeMirror))
                        .build();
        final JavaFile javaFile = JavaFile.builder(mPackageName + ".wxapi", targetActivity)
                .addFileComment("生成了微信sdk中要求的Activity:WXEntryActivity。获取微信用户信息后的回调Activity。")
                .build();
        try {
            javaFile.writeTo(FILER);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}
